shell_integration/macOS/FileProviderUIExt: Check locking is available on the server...
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Mon, 10 Feb 2025 03:57:21 +0000 (11:57 +0800)
committerMatthieu Gallien <matthieu.gallien@nextcloud.com>
Mon, 10 Feb 2025 11:02:18 +0000 (12:02 +0100)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Locking/LockViewController.swift

index d93e2ec17dde49976f7991d0fb97b5c14b31906a..4ab55ccb34d9106a659e43938e58815c11e546ba 100644 (file)
@@ -7,6 +7,7 @@
 
 import AppKit
 import FileProvider
+import NextcloudCapabilitiesKit
 import NextcloudFileProviderKit
 import NextcloudKit
 import OSLog
@@ -76,6 +77,20 @@ class LockViewController: NSViewController {
         stopIndicatingLoading()
     }
 
+    private func fetchCapabilities(account: Account, kit: NextcloudKit) async -> Capabilities? {
+        return await withCheckedContinuation { continuation in
+            kit.getCapabilities(account: account.ncKitAccount) { account, data, error in
+                guard error == .success, let capabilitiesJson = data?.data else {
+                    self.presentError("Error getting server caps: \(error.errorDescription)")
+                    continuation.resume(returning: nil)
+                    return
+                }
+                Logger.lockViewController.info("Successfully retrieved server share capabilities")
+                continuation.resume(returning: Capabilities(data: capabilitiesJson))
+            }
+        }
+    }
+
     private func processItemIdentifier(_ itemIdentifier: NSFileProviderItemIdentifier) async {
         guard let manager = NSFileProviderManager(for: actionViewController.domain) else {
             fatalError("NSFileProviderManager isn't expected to fail")
@@ -168,7 +183,12 @@ class LockViewController: NSViewController {
                 nextcloudVersion: 25,
                 groupIdentifier: ""
             )
-            // guard let capabilities = await fetchCapabilities() else {
+            guard let capabilities = await fetchCapabilities(account: account, kit: kit),
+                  capabilities.files?.locking != nil
+            else {
+                presentError("Server does not have the ability to lock files.")
+                return
+            }
             guard let itemMetadata = await fetchItemMetadata(
                 itemRelativePath: serverPathString, account: account, kit: kit
             ) else {